home *** CD-ROM | disk | FTP | other *** search
- /* Listing 3 */
-
- /*begin************************************************
- * Program : closest
- * Descript. : Returns the number of the closest color
- * from the palette, given the desired red
- * green, and blue. Find the closest point
- * by using the red index arrey. Look at
- * points on both sides of the closest
- * point. While searching, if a point is
- * closer then it is the shortest distance
- * Once you are examining points that are
- * farther away in just the one dimension
- * (red) then you are done.
- *end**************************************************/
-
- int closest( int red, int green, int blue )
- {
- long least;
- long dif;
- long sum;
- int index;
- int left;
- int right;
-
- index = redindex[ red ];
- least = dist( red, green, blue, index );
- left = index;
- right = index;
-
- while( ( left >= 0 ) || ( right < PAL_LEN ) )
- {
- if ( --left >= 0 )
- {
- /* if red dist. alone is greater, then quit */
- dif = red - pals[ left ].red;
- if ( ( dif * dif ) > least )
- left = -1;
- else
- {
- sum = dist( red, green, blue, left );
- if ( sum < least )
- {
- least = sum;
- index = left;
- }
- }
- }
- if ( ++right < PAL_LEN )
- {
- /* if red dist. alone is greater, then quit */
- dif = red - pals[ right ].red;
- if ( ( dif * dif ) > least )
- right = PAL_LEN;
- else
- {
- sum = dist( red, green, blue, right );
- if ( sum < least )
- {
- least = sum;
- index = right;
- }
- }
- }
- }
- return( pals[ index ].num );
- }
-
-
-
- /*begin************************************************
- * Program : dist
- * Descript. : Color distance (squared)
- *end**************************************************/
-
- long dist( int red, int green, int blue, int num )
- {
- long dif;
- long sum;
- pal *palt;
-
- palt = &pals[ num ];
- dif = red - palt->red;
- sum = dif * dif;
- dif = green - palt->grn;
- sum += dif * dif;
- dif = blue - palt->blu;
- sum += dif * dif;
- return( sum );
- }